//
//  TFDatabaseObject.h
//  TFFoundation
//
//  Created by TFAppleWork-Summer on 2017/3/21.
//  Copyright © 2017年 TFAppleWork-Summer. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <FMDB/FMDB.h>
#import "TFDatabaseTableListModel.h"

@protocol TFDatabaseTableListModel;

typedef NSString *kTFDatabaseTableKey NS_STRING_ENUM;

@class FMResultSet;

/**
 打开数据库的数据处理

 @param db 数据库对象
 */
typedef void(^TFDatabaseHandlerBlock)(FMDatabase * __nonnull db);

/**
 根据sql语句筛选出的数据处理block

 @param resultSet 数据集
 */
typedef void(^TFDatabaseResultHandlerBlock)(FMResultSet * __nonnull resultSet);

/**
 根据sql语句筛选出来的结果集做数据转换的block

 @param resultSet 数据集
 @return 转换后的数据
 */
typedef __nonnull id(^TFDatabaseResultConvertBlock)(FMResultSet * __nonnull resultSet);

/**
 数据库工具类
 */
@interface TFDatabaseObject : NSObject

/**
 数据库对象默认根目录

 @return 地址
 */
+ (nonnull NSString *)dataBaseDefaultRootPath;

///=============================================================================
/// @name 数据库和表操作
///=============================================================================

/**
 根据数据库名称初始化数据库对象

 @param databaseName 数据库名称
 @return 数据库对象
 */
- (nonnull instancetype)initWithDatabaseName:(nonnull NSString *)databaseName;

/**
 根据数据库本地路径地址初始化数据库对象

 @param databasePath 数据库地址
 @return 数据库对象
 */
- (nonnull instancetype)initWithDatabasePath:(nonnull NSString *)databasePath;

/**
 数据库路径
 */
@property (nonatomic, strong, readonly, nonnull) NSString *path;

/**
 数据库处理

 @param handlerBlock 数据库处理block
 */
- (void)executeDatabaseWithHandlerBlock:(nonnull TFDatabaseHandlerBlock)handlerBlock;

/**
 执行更新类的sql语句

 @param sql sql语句
 @return 是否成功
 */
- (BOOL)executeUpdateWithSql:(nonnull NSString *)sql;

/**
 执行询问类的sql语句

 @param sql sql语句
 @param resultHandlerBlock 数据处理block
 */
- (void)executeQueryWithSql:(nonnull NSString *)sql resultHandlerBlock:(nonnull TFDatabaseResultHandlerBlock)resultHandlerBlock;

/**
 根据sql语句创建表

 @param sql sql
 @return 是否创建成功
 */
- (BOOL)createTableWithSql:(nonnull NSString *)sql;

/**
 根据表的对应的定义对象创建表

 @param tableName 表的名字
 @param listArray 列对象数组
 @return 是否创建成功
 */
- (BOOL)createTableWithTableName:(nonnull NSString *)tableName listArray:(nonnull NSArray<TFDatabaseTableListModel *> *)listArray;

/**
 根据表名查询这张表是否存在

 @param name 表名字
 @return 是否存在这张表
 */
- (BOOL)isTableExistsWithName:(nonnull NSString *)name;

/**
 根据表名清空表中的所有数据

 @param name 表名字
 @return 是否清空成功
 */
- (BOOL)clearTableWithName:(nonnull NSString *)name;

/**
 删除某张表

 @param name 表名字
 @return 是否删除成功
 */
- (BOOL)dropTableWithName:(nonnull NSString *)name;

/**
 关闭数据库
 */
- (void)close;

///=============================================================================
/// @name 数据库中数据操作
///=============================================================================

/**
 获取表中数据的数量

 @param tableName 表名字
 @return NSInteger
 */
- (NSInteger)getDataCountWithTableName:(nonnull NSString *)tableName;

/**
 根据sql语句获取表中的数据

 @param sql sql语句
 @param resultConvertBlock 结果转换block
 @return 数据数组
 */
- (nonnull NSArray *)getDataArrayWithSql:(nonnull NSString *)sql resultConvertBlock:(nonnull TFDatabaseResultConvertBlock)resultConvertBlock;

/**
 获取所有的数据

 @param tableName 表名
 @param resultConvertBlock 结果转换block
 @return 数据数组
 */
- (nonnull NSArray *)getAllDataArrayWithTableName:(nonnull NSString *)tableName resultConvertBlock:(nonnull TFDatabaseResultConvertBlock)resultConvertBlock;


@end
